package projetomsn.Client.ServerInterface;


import java.io.IOException;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.DatagramPacket;
import java.net.SocketTimeoutException;
import java.util.StringTokenizer;
import projetomsn.Server.ServerInterface;



/**
 * Classe de Threat implementado para receber as mensagens
 */
public class ThreadToGetMessages implements Runnable 
{
    /**
     * Recebe a mensagem
     */
   private ServerInterface serverInterface;
   /**
    * Recebe transmissão de mensagens
    */
   private MulticastSocket socket;
   /**
    * 
    */
   private InetAddress groupForMulticast; // InetAddress para grupo de multicast
   /**
    * Encerra as operações de ThreadToGetMessages
    */
   private boolean clientIsOn = true; // termina ThreadToGetMessages
   
   /**
    * Metodo construtor da classe ThreatToGetMessages
    * @param serverInterface 
    */
   public ThreadToGetMessages( ServerInterface serverInterface ) 
   {
      this.serverInterface = serverInterface; //  configura  a interface
      
      
      try 
      {
         // cria um no socket para multicast
         socket = new MulticastSocket(
             5555);//MULTICAST_LISTENING_PORT,ServerSettings.porta_recebimento_multicast
         
         // usa o InetAddress para obter o grupo de multicast
         groupForMulticast = InetAddress.getByName( "239.0.0.1" );
         
         // se junta ao grupo de multcast
         socket.joinGroup( groupForMulticast ); 
         
        
         socket.setSoTimeout( 5000 );
      } 
      catch ( IOException ioException ) 
      {
         ioException.printStackTrace();
      } 
   } 
   
   /**
    * Ouve mensagens do grupo de multicast 
    */
   public void run() 
   {          
     
      while ( clientIsOn ) 
      {
         // cria buffer para as mensagens recebidas
         byte[] buffer = new byte[ 512 ];

         // cria Datagrama para as mensagens recebidas
         DatagramPacket packet = new DatagramPacket( buffer, 
            512 );

         try 
         {            
            socket.receive( packet ); 
         } 
         catch ( SocketTimeoutException ex ) 
         {
            continue; 
         } 
         catch ( IOException ioException ) 
         {
            ioException.printStackTrace();
            break;
         } 
          // coloca a mensagem dentro de uma String
         String msg = new String( packet.getData() );

         msg = msg.trim(); // elimina espaço em branco da mensagem

        

         
         StringTokenizer stringTokenizer = new StringTokenizer( 
            msg,  ">>>");

         
            // envia mensagens para ServerInterface
             
             
            serverInterface.messageReceived( 
               stringTokenizer.nextToken(), // nome do usuário
               stringTokenizer.nextToken() ); // corpo da mensagem
          
      } 

      try 
      {
         socket.leaveGroup( groupForMulticast ); //deixa o grupo
         socket.close(); //fecha o socket de multcast 
      } 
      catch ( IOException exception)
      { 
         
      } 
   } 
   
   /** 
    * Para de ouvir novas mensagens
    */
   public void clientOff() 
   {
      clientIsOn = false;
   } 
} 
